home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / pixel.asm < prev    next >
Assembly Source File  |  1992-08-17  |  5KB  |  207 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4. public  _PixelClip
  5. public  _Pixel
  6. public  _PixelSwap
  7. public  _PixelROP
  8. public  _ReadPixel
  9.  
  10.  
  11. .CODE
  12. ;----------------------------------------------------------------------------
  13. ; void PixelClip    (int X, int Y, COLOR)
  14. ; void Pixel        (int X, int Y, COLOR)
  15. ; COLOR PixelSwap    (int X, int Y, COLOR)
  16. ;
  17.  
  18. _PixelClip proc X:WORD, Y:WORD, COLOR:WORD
  19.         push    bp
  20.         mov     bp,sp
  21.         push    ds
  22.         mov     ax,@data
  23.         mov     ds,ax
  24.         mov     ax,X
  25.         cmp     ax,_ClipLeft
  26.         jl      @@pc_exit
  27.         cmp     ax,_ClipRight
  28.         jg      @@pc_exit
  29.         mov     ax,Y
  30.         cmp     ax,_ClipTop
  31.         jl      @@pc_exit
  32.         cmp     ax,_ClipBottom
  33.         jg      @@pc_exit
  34.         jmp     short pc_okay
  35. @@pc_exit:
  36.         pop     ds
  37.         pop     bp
  38.         ret
  39. _PixelClip      endp
  40.  
  41. _Pixel proc
  42.         push    bp
  43.         mov     bp,sp
  44.         push    ds
  45.         mov     ax,@data
  46.         mov     ds,ax
  47. pc_okay:
  48.         mov     es,_ModeX_Segment     ; put video segment in ES
  49.  
  50.         mov     bx,Y
  51.         shl     bx,1
  52.         mov     bx,word ptr _RowOffset[bx]
  53.         add        bx,_Display_Offset
  54.         mov     ax,X
  55.         mov     cl,al           ; prepare CL to compute plane
  56.         shr     ax,2            ; X/4 = offset of pixel in scan line
  57.         add     bx,ax           ; final offset of pixel in page
  58.  
  59.         and     cl,011b         ; CL = pixel's plane
  60.         mov     ax,1100h+MAP_MASK ; AL = index in SC of Map Mask reg
  61.         shl     ah,cl           ; set only the bit for the pixel's plane to 1
  62.         mov     dx,SC_INDEX     ; set the Map Mask to enable only
  63.         out     dx,ax           ;   the pixel's plane
  64.  
  65.         mov     al,byte ptr COLOR
  66.         mov     es:[bx],al      ; draw the pixel in the desired color
  67.  
  68.         pop     ds
  69.         pop     bp
  70.         ret
  71. _Pixel          endp
  72.  
  73. _PixelSwap      proc
  74.         push    bp
  75.         mov     bp,sp
  76.         push    ds
  77.         mov     ax,@data
  78.         mov     ds,ax
  79.         mov     es,_ModeX_Segment     ; put video segment in ES
  80.  
  81.         mov     bx,Y
  82.         shl     bx,1
  83.         mov     bx,word ptr _RowOffset[bx]
  84.         mov     ax,X
  85.         shr     ax,2            ; X/4 = offset of pixel in scan line
  86.         add     bx,ax           ; final offset of pixel in page
  87.  
  88.         mov     cl,byte ptr X
  89.         and     cl,011b         ; CL = pixel's plane
  90.         mov     ah,cl
  91.         mov     al,READ_MAP
  92.         mov     dx,GC_INDEX
  93.         out     dx,ax
  94.         mov     ax,0100h+MAP_MASK ; AL = index in SC of Map Mask reg
  95.         shl     ah,cl           ; set only the bit for the pixel's plane to 1
  96.         mov     dx,SC_INDEX     ; set the Map Mask to enable only
  97.         out     dx,ax           ;   the pixel's plane
  98.  
  99.         mov     al,byte ptr COLOR
  100.         xchg    es:[bx],al      ; draw the pixel in the desired color
  101.  
  102.         pop     ds
  103.         pop     bp
  104.         ret
  105. _PixelSwap      endp
  106.  
  107.  
  108.  
  109. ;----------------------------------------------------------------------------
  110. ;    COLOR ReadPixel(int X, int Y);
  111.  
  112. _ReadPixel proc X:WORD, Y:WORD
  113.         push    bp
  114.         mov     bp,sp
  115.         push    ds
  116.         mov        ax,@data
  117.         mov        ds,ax
  118.  
  119. ;        mov     ax,_Virtual_Width
  120. ;        mul     Y  ;offset of pixel's scan line in page
  121.         mov        di,Y
  122.         shl        di,1
  123.         mov        ax,word ptr _RowOffset[di]
  124.         mov     bx,X
  125.         shr     bx,1
  126.         shr     bx,1    ;X/4 = offset of pixel in scan line
  127.         add     bx,ax   ;offset of pixel in page
  128.         add     bx,_Display_Offset ;offset of pixel in display memory
  129.         mov     ax,_ModeX_Segment
  130.         mov     es,ax   ;point ES:BX to the pixel's address
  131.  
  132.         mov     ah,byte ptr X
  133.         and     ah,011b ;AH = pixel's plane
  134.         mov     al,READ_MAP ;AL = index in GC of the Read Map reg
  135.         mov     dx,GC_INDEX ;set the Read Map to read the pixel's
  136.         out     dx,ax       ; plane
  137.  
  138.         mov     al,es:[bx] ;read the pixel's color
  139.         sub     ah,ah   ;convert it to an unsigned int
  140.  
  141.         pop        ds
  142.         pop     bp
  143.         ret
  144. _ReadPixel     endp
  145.  
  146.  
  147. ;----------------------------------------------------------------------------
  148. ; void PixelROP(int x, int y, COLOR, ROP);
  149. ;
  150.         public  _PixelROP
  151. _PixelROP proc far
  152. ARG posX, posY, COLOR, ROP
  153.         push    bp
  154.         mov     bp,sp
  155.         push    ds
  156.         mov        ax,@data
  157.         mov        ds,ax
  158.  
  159.         mov     ax,_Virtual_Width_Addr
  160.         mul     posY  ;offset of pixel's scan line in page
  161.         mov     bx,posX
  162.         shr     bx,1
  163.         shr     bx,1    ;X/4 = offset of pixel in scan line
  164.         add     bx,ax   ;offset of pixel in page
  165.         add     bx,_Draw_Offset ;offset of pixel in display memory
  166.         mov     ax,_ModeX_Segment
  167.         mov     es,ax   ;point ES:BX to the pixel's address
  168.  
  169.         mov     cl,byte ptr posX
  170.         and     cl,011b ;CL = pixel's plane
  171.         mov     ax,0100h + MAP_MASK ;AL = index in SC of Map Mask reg
  172.         shl     ah,cl   ;set only the bit for the pixel's plane to 1
  173.         mov     dx,SC_INDEX ;set the Map Mask to enable only the
  174.         out     dx,ax       ; pixel's plane
  175.  
  176.         ;select the Function
  177.         mov        al,FUN_SELECT
  178.         mov        ah,byte ptr ROP
  179.         mov     dx,GC_INDEX
  180.         out     dx,ax
  181.  
  182.         ;prime the latches
  183.         mov     ah,byte ptr X
  184.         and     ah,011b ;AH = pixel's plane
  185.         mov     al,READ_MAP ;AL = index in GC of the Read Map reg
  186. ;        mov     dx,GC_INDEX ;set the Read Map to read the pixel's
  187.         out     dx,ax       ; plane
  188.         mov     al,es:[bx] ;read the pixel's color
  189.  
  190.         mov     al,byte ptr COLOR
  191.         mov     es:[bx],al ;draw the pixel in the desired color
  192.  
  193.         ;reset the function to PUT
  194.         mov        al,FUN_SELECT
  195.         xor        ah,ah
  196. ;        mov        ah,0        ;PUT
  197. ;        mov     dx,GC_INDEX
  198.         out     dx,ax
  199.  
  200.         pop        ds
  201.         pop     bp
  202.         ret
  203. _PixelROP endp
  204.  
  205.  
  206. END
  207.